package com.zyl.Ecs.realtime.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.zyl.Ecs.realtime.datasource.DataSourceTypeEnum;
import com.zyl.Ecs.realtime.datasource.DynamicDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @version v1.0
 * @ProjectName: Ecs
 * @Package: com.zyl.Ecs.realtime.config
 * @ClassName: DataSourceConfig
 * @Description TODO (数据源配置类)
 * @Author 翟玉龙
 * @Date 2024/12/6-13:45
 */
@Configuration
public class DataSourceConfig {

    /**
     * 主数据源 (可读可写的主数据源)
     */
    @Bean(name = "dataSourceMaster")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create()
                .type(DruidDataSource.class)
                .build();
    }

    /**
     * 从数据源（只读数据源-实时数据）
     */
    @Bean(name = "dataSourceSlave")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource salveDataSourceA() {
        return DataSourceBuilder.create()
                .type(DruidDataSource.class)
                .build();
    }

    /**
     * 从数据源（只读数据源-实时数据）
     */
    @Bean(name = "dataSourceSlave2")
    @ConfigurationProperties(prefix = "spring.datasource.slave2")
    public DataSource salveDataSourceB() {
        return DataSourceBuilder.create()
                .type(DruidDataSource.class)
                .build();
    }

    /**
     * 将多数据源加载到数据库路由
     *
     * @param dataSourceMaster 写数据源
     * @param dataSourceSlave  读数据源 - 实时数据
     * @param dataSourceSlave2 读数据源 - 实时数据
     * * @param dataSourceSlaveHistory  读数据源 - 历史数据
     * @return 自定义动态数据源对象
     */
    @Bean
    public DataSource dynamicDataSource(
            @Qualifier("dataSourceMaster") DataSource dataSourceMaster,
            @Qualifier("dataSourceSlave") DataSource dataSourceSlave,
            @Qualifier("dataSourceSlave2") DataSource dataSourceSlave2
    ) {
        /* 将所有用到的数据源对象全部存入Map，使用枚举类型作为key */
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceTypeEnum.MASTER, dataSourceMaster);
        targetDataSources.put(DataSourceTypeEnum.SLAVE, dataSourceSlave);
        targetDataSources.put(DataSourceTypeEnum.SLAVE_2, dataSourceSlave2);

        /* 创建动态数据源对象 */
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        /* 设置默认数据源（默认使用主库） */
        dynamicDataSource.setDefaultTargetDataSource(dataSourceMaster);
        /* 写入所有数据源Map */
        dynamicDataSource.setTargetDataSources(targetDataSources);
        return dynamicDataSource;
    }
}